package Classes;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import Classes.ManipulaArquivo;
import Classes.ManipulaUsuario;

public class Caso3 {
	
	public static void main(String[] args) {
		Caso3 c3 = new Caso3();
		System.out.println(c3.caso3Personalizada("Nazareno", 10));
	}
	
	public String[][] caso3Global(int numeroRecomendacoes) {
		Caso2 c2 = new Caso2();
		List<Integer> notas1 = c2.somaNotas();
		List<Integer> notas2 = c2.organizaNotas();
		
		String[][] tabela = new String[ManipulaEstabelecimento.getListaEstabelecimento().size()][3];
		
		for (int i = 0; i < numeroRecomendacoes; i++) {
	    	int cont = 0;
	    	tabela[i][cont] = ManipulaEstabelecimento.getListaEstabelecimento().get(notas1.indexOf(notas2.get(i))).getNome();
	    	cont++;
	    	tabela[i][cont] = ManipulaEstabelecimento.getListaEstabelecimento().get(notas1.indexOf(notas2.get(i))).getEndereco();
	    	cont++;
	    	tabela[i][cont] = ManipulaEstabelecimento.getListaEstabelecimento().get(notas1.indexOf(notas2.get(i))).getTipoAlmooco();
	    }
		
		return tabela;
	}
	
	public static String[][] caso3Personalizada(String nome, int numeroRecomendacoes) {
		
		String caminhoUs = "opinioes-dos-usuarios-v2.data";
		String caminhoEs = "Estabelecimentos.data";
		ManipulaArquivo arq = new ManipulaArquivo(caminhoUs,caminhoEs);
		ManipulaUsuario usuarios = new ManipulaUsuario();
		
		List<Usuario> copiaUsuario = new ArrayList<Usuario>();
		
		copiaUsuario.addAll(ManipulaUsuario.getListaUsuario());
		copiaUsuario.remove(0);
		
		Usuario usuario = ManipulaUsuario.getUsuarioNome(nome);
		
		List<Integer> x = new ArrayList<Integer>(); // lista com o numero de gostos igual dos demais usuarios com esse usuario, -1 eh a afinadade com ele msm
		List<Integer> y = new ArrayList<Integer>();
		int igual = 0;
		for (int i = 0; i < copiaUsuario.size(); i++) {
			for (int j = 0; j < usuario.getNotas().size(); j++) {
				if (nome.equals(copiaUsuario.get(i).getNome())) {
					igual = -1;
				}else{
					if(usuario.getNotas().get(j).equals(copiaUsuario.get(i).getNotas().get(j))) {
						igual += 1;
					}
				}
			}
			x.add(igual);
			igual = 0;
		}
		
		y.addAll(x);
	    Collections.sort(y);
	    Collections.reverse(y);
	    
	    List<Usuario> lista = new ArrayList<Usuario>(); //Lista para armazenar os usuarios com gosto parecido
	    
	    int a = 0; // mesmo numero de gosto parecido
	    for (int i = 0; i < y.size(); i++) {
	    	if (a != y.get(i)) {
	    		lista.add(copiaUsuario.get(x.indexOf(y.get(i))));
	    		a = y.get(i);
	    	}else {
	    		lista.add(copiaUsuario.get(x.subList(x.indexOf(y.get(i))+1, x.size()-1).indexOf(y.get(i))+x.indexOf(y.get(i))+1));
	    	}
	    }
	    
	    List<String> gostoParecido = new ArrayList<String>();
	    List<String> gostoParecido2 = new ArrayList<String>();
	    
	    for (int i = 0; i < lista.size(); i++) {
	    	for (int j = 0; j < lista.get(i).getNotas().size(); j++) {
	    		if (Integer.parseInt(lista.get(i).getNotas().get(j).replace(" ", "").split(":")[0]) > 0 && Integer.parseInt(usuario.getNotas().get(j).replace(" ", "").split(":")[0]) == 0) {
	    			gostoParecido.add(ManipulaEstabelecimento.getListaEstabelecimento().get(j).getNome());
	    			if (gostoParecido2.contains(ManipulaEstabelecimento.getListaEstabelecimento().get(j).getNome()) == false) {
	    				gostoParecido2.add(ManipulaEstabelecimento.getListaEstabelecimento().get(j).getNome());
	    			}
	    		}
	    	}
	    }
	    
	    String[][] tabela = new String[gostoParecido2.size()][3];
	    
	    if (numeroRecomendacoes > gostoParecido2.size()) {
	    	for (int i = 0; i < gostoParecido2.size(); i++) {
	    		int cont = 0;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getNome();
		    	cont++;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getEndereco();
		    	cont++;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getTipoAlmooco();
		    }
	    }else {
	    	for (int i = 0; i < numeroRecomendacoes; i++) {
	    		int cont = 0;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getNome();
		    	cont++;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getEndereco();
		    	cont++;
		    	tabela[i][cont] = ManipulaEstabelecimento.getEstabelecimentoNome(gostoParecido2.get(i)).getTipoAlmooco();
	    	}
	    }
	    
	    return tabela;
		
	}
		
}


